package core.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import util.DbUtils;
import core.dao.EmpresaDao;
import core.model.Empresa;

/**
 * @author andoniibarguchilorenzo
 * clase que contiene los metodos implementados de la interface EmpresaDao
 */
public class EmpresaDaoImpl extends GenericDaoImpl<Empresa, Integer> implements
		EmpresaDao {

	public Empresa findCodigoEmpresa(int codigo_empresa) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Empresa> empresas = new ArrayList<Empresa>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_EMPRESA, NOMBRE FROM EMPRESA WHERE COD_EMPRESA = ? ");
			ps.setInt(1, codigo_empresa);

			ResultSet rs = ps.executeQuery();
			Empresa empresa = null;

			while (rs.next()) {
				empresa = Empresa.createEmpresa(rs.getInt(1), rs.getString(2));
				empresas.add(empresa);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return empresas.get(0);
	}

	public List<Empresa> getEmpresas() {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Empresa> empresas = new ArrayList<Empresa>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_EMPRESA, NOMBRE FROM EMPRESA");

			ResultSet rs = ps.executeQuery();
			Empresa empresa = null;

			while (rs.next()) {
				empresa = Empresa.createEmpresa(rs.getInt(1), rs.getString(2));
				empresas.add(empresa);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return empresas;
	}

	@Override
	public void insertEmpresa(Empresa empresa) {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		try {
			// http://db.apache.org/derby/docs/10.7/ref/crefjavstateautogen.html
			ps = connection.prepareStatement(
					"INSERT INTO EMPRESA (COD_EMPRESA, NOMBRE) VALUES (?,?)",
					PreparedStatement.RETURN_GENERATED_KEYS);
			ps.setInt(1, empresa.getCodigo_empresa());
			ps.setString(2, empresa.getNombre());
			ps.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		}

	}

	public Empresa findByNombreEmpresa(String nombre_empresa) {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Empresa> empresas = new ArrayList<Empresa>();

		try {
			ps = connection
					.prepareStatement("SELECT COD_EMPRESA, NOMBRE FROM EMPRESA WHERE NOMBRE = ? ");
			ps.setString(1, nombre_empresa);
			ResultSet rs = ps.executeQuery();

			Empresa empresa = null;
			while (rs.next()) {
				empresa = Empresa.createEmpresa(rs.getInt(1), rs.getString(2));
				empresas.add(empresa);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return empresas.get(0);

	}
	
	@Override		
	public Empresa findPrecio(int codigo_empresa, String codigo_producto) {
		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Empresa> empresas = new ArrayList<Empresa>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_EMPRESA, COD_PRODUCTO, PRECIO FROM TIENE WHERE COD_EMPRESA = ? AND COD_PRODUCTO = ?");
			ps.setInt(1, codigo_empresa);
			ps.setString(2, codigo_producto);

			ResultSet rs = ps.executeQuery();
			Empresa empresa = null;

			while (rs.next()) {
				empresa = Empresa.createEmpresa(rs.getInt(1), rs.getString(2), rs.getDouble(3));
				empresas.add(empresa);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return empresas.get(0);
	}

	@Override  
	public List<Empresa> findByCodigoProducto(String codigo_producto) {

		Connection connection = DbUtils.createInstance();
		PreparedStatement ps = null;
		List<Empresa> empresas = new ArrayList<Empresa>();
		try {
			ps = connection
					.prepareStatement("SELECT COD_EMPRESA, COD_PRODUCTO, PRECIO FROM TIENE WHERE COD_PRODUCTO = ?");
			ps.setString(1, codigo_producto);

			ResultSet rs = ps.executeQuery();
			Empresa empresa = null;

			while (rs.next()) {
				empresa = Empresa.createEmpresa(rs.getInt(1), rs.getString(2), rs.getDouble(3));
				empresas.add(empresa);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}

		return empresas;
	}

}
